home *** CD-ROM | disk | FTP | other *** search
- /*
- syslog.c
-
- syslog glue for indirect access to the syslog component.
-
- */
-
-
- #include <stdarg.h>
- #include <string.h>
- #include <stdio.h>
-
- #include <Components.h>
-
- #include "syslog.h"
-
- #include "libsprintf.h"
-
- ComponentInstance _gSyslogComponent=(ComponentInstance)0;
- char* _gSyslogBuf=(char*)0;
- void SyslogInit(void);
-
- void syslog(short priority,const char* format,...){
-
- // try to open if not already done so
- if (_gSyslogComponent==(ComponentInstance)0)
- SyslogInit();
-
- // still couldn't open, return
- if (_gSyslogComponent==(ComponentInstance)0)
- return;
-
- // expand into buf
- libvsprintf(_gSyslogBuf,format,__va(format));
-
- // expanded, now send to syslog
- Comp_syslog(_gSyslogComponent,priority,_gSyslogBuf);
- }
-
- void openlog(const char* ident,short logopts,short facility){
-
- // try to open if not already done so
- if (_gSyslogComponent==(ComponentInstance)0)
- SyslogInit();
-
- // still couldn't open, return
- if (_gSyslogComponent==(ComponentInstance)0)
- return;
-
- Comp_openlog(_gSyslogComponent,ident,logopts,facility);
- }
-
- void closelog(void){
-
- // try to open if not already done so
- if (_gSyslogComponent==(ComponentInstance)0)
- SyslogInit();
-
- // still couldn't open, return
- if (_gSyslogComponent==(ComponentInstance)0)
- return;
-
- Comp_closelog(_gSyslogComponent);
- }
-
- OSErr syslogerr(void){
- OSErr err;
-
- // try to open if not already done so
- if (_gSyslogComponent==(ComponentInstance)0)
- SyslogInit();
-
- // still couldn't open, return
- if (_gSyslogComponent==(ComponentInstance)0)
- return (OSErr)-1;
-
- Comp_geterror(_gSyslogComponent,&err);
-
- return err;
- }
-
- OSErr setsyslogfile(FSSpecPtr spec){
-
- // try to open if not already done so
- if (_gSyslogComponent==(ComponentInstance)0)
- SyslogInit();
-
- // still couldn't open, return
- if (_gSyslogComponent==(ComponentInstance)0)
- return;
-
- return (OSErr)Comp_setfile(_gSyslogComponent,spec);
- }
-
- short setlogmask(short maskpri){
- short oldpri;
-
- // try to open if not already done so
- if (_gSyslogComponent==(ComponentInstance)0)
- SyslogInit();
-
- // still couldn't open, return
- if (_gSyslogComponent==(ComponentInstance)0)
- return 0;
-
- oldpri=Comp_setlogmask(_gSyslogComponent,maskpri);
-
- return oldpri;
- }
-
- /*
- HaveComponentMgr
-
- Uses Gestalt to check for the availability of the Component Manager. We assume that if Gestalt
- does not return an error then the Component Manager exists. If we were concerned with what
- version of the Component Manager that we had we could check the result to see if it is at least
- the version that we need.
- */
- Boolean HaveComponentMgr(void){
- OSErr err;
- long result;
-
- err=Gestalt(gestaltComponentMgr,&result);
-
- if (err!=noErr)
- return false;
- else
- return true;
- }
-
- enum {
- uppExitToShellProcInfo=kPascalStackBased
- };
- #if USESROUTINEDESCRIPTORS
- typedef UniversalProcPtr ExitToShellUPP;
- #define NewExitToShellProc(routine) \
- (ExitToShellUPP) NewRoutineDescriptor((ProcPtr)(routine), \
- uppExitToShellProcInfo, GetCurrentISA())
- #define CallExitToShellProc(routine) \
- CallUniversalProc((UniversalProcPtr)(routine), uppExitToShellProcInfo)
-
- #else
- typedef pascal void (*ExitToShellUPP)(void);
-
- #define NewExitToShellProc(routine) (ExitToShellUPP)(routine)
- #define CallExitToShellProc(routine) (*(routine))()
-
- #endif
-
- #define DisposeExitToShellProc(routine) DisposeRoutineDescriptor((UniversalProcPtr)routine)
-
- static ExitToShellUPP _gSyslog_oldETS;
- static ExitToShellUPP _gSyslog_newETS;
- static long _gSyslog_A5;
-
- pascal void SyslogAtExit(void);
- pascal void SyslogAtExit(void){
-
- #if defined(powerc)||defined(__powerc)
- #else
- // 68k code
- SetA5(_gSyslog_A5);
- #endif
-
- // if we get here then the component has been opened and it needs closed
- DisposePtr((Ptr)_gSyslogBuf);
- CloseComponent(_gSyslogComponent);
-
- DisposeRoutineDescriptor(_gSyslog_newETS);
-
- CallExitToShellProc(_gSyslog_oldETS);
- return;
- }
-
- /*
- SyslogInit
-
- Initialize the internal syslog glue. Also inserts a ETS patch to ensure that the
- component gets closed when the app is quitting.
- */
- void SyslogInit(void){
- Component theComp;
- ComponentDescription desc;
-
- if (!HaveComponentMgr())
- return;
-
- if (_gSyslogComponent!=(ComponentInstance)0)
- return; // already initialized
-
- _gSyslogBuf=(char*)NewPtr(4096*2); // allocate an 8k buffer
-
- if (_gSyslogBuf==(char*)0)
- return;
-
-
- desc.componentType=ksyslogComponentType;
- desc.componentSubType=kAnyComponentType;
- desc.componentManufacturer=kAnyComponentType;
- desc.componentFlags=kAnyComponentType;
- desc.componentFlagsMask=kAnyComponentType;
-
- theComp=FindNextComponent((Component)0,&desc);
-
- if (theComp!=(Component)0){
-
- _gSyslogComponent=OpenComponent(theComp);
-
- if (_gSyslogComponent==(ComponentInstance)0){
- DisposePtr((Ptr)_gSyslogBuf);
- return;
- }
-
- _gSyslog_newETS=NewExitToShellProc(SyslogAtExit);
-
- #if defined(powerc)||defined(__powerc)
- // nothing special here
- #else
- // 68k code
- _gSyslog_A5=SetCurrentA5();
- #endif
-
- // have the component, and it is open. Install the ETS patch
- _gSyslog_oldETS=(ExitToShellUPP)NGetTrapAddress(_ExitToShell,ToolTrap);
- NSetTrapAddress((UniversalProcPtr)_gSyslog_newETS,_ExitToShell,ToolTrap);
-
- } else {
- // couldn't find the component
- DisposePtr((Ptr)_gSyslogBuf);
- }
-
- return;
- }
-
-
- #if defined(powerc) || defined(__powerc)
-
- enum {
- uppCallComponentProcInfo = kPascalStackBased
- | RESULT_SIZE(kFourByteCode)
- | STACK_ROUTINE_PARAMETER(1, kFourByteCode)
- };
-
- /* A few macros to simplify the code (or does it make it more complex? ;-) */
- #define CallComponentGlue(ptr) \
- CallUniversalProc(CallComponentUPP,uppCallComponentProcInfo,(ptr))
-
- #define PPC_Glue(parmsType) \
- unsigned char flags; \
- unsigned char size; \
- short what; \
- parmsType parms; \
- ComponentInstance inst
-
- #define SetupGlue(var,sel,type,ic)\
- (var).flags=0;\
- (var).size=sizeof(type);\
- (var).what=(sel);\
- (var).inst=(ic)
-
- #define PPC_VoidGlue \
- unsigned char flags; \
- unsigned char size; \
- short what; \
- ComponentInstance inst
-
- #define SetupVoidGlue(var,sel,ic)\
- (var).flags=0;\
- (var).size=0;\
- (var).what=(sel);\
- (var).inst=(ic)
-
- #define SetGlueParm(var,ps,val) \
- (var).parms.ps=(val)
-
- pascal ComponentResult Comp_setlogmask(ComponentInstance inst,short maskpri){
- ComponentResult err;
-
- #pragma options align=mac68k
- // Remember that these must be in reverse order from the parameters
- struct GlueParms {
- short maskpri;
- };
-
- typedef struct GlueParms GlueParms;
-
- struct ICCallGlue {
- PPC_Glue(GlueParms);
- };
-
- typedef struct ICCallGlue ICCallGlue;
- #pragma options align=reset
-
- ICCallGlue glue;
-
- if (inst == (ComponentInstance)0) {
- err = badComponentInstance;
- } else {
- // only one for the glue struct
- SetupGlue(glue,ksetlogmaskSelector,GlueParms,inst);
- // the glue struct, the selector code, the parameter struct, and the instance
-
- // one of these for each parameter
- SetGlueParm(glue,maskpri,maskpri);
- // the glue struct, the parameter struct item to set, and the function parameter to use
-
- // call the component now
- err = CallComponentGlue(&glue);
- }
-
- return err; // return the error
- }
-
- pascal ComponentResult Comp_geterror(ComponentInstance inst,OSErr* errp){
- ComponentResult err;
-
- #pragma options align=mac68k
- struct GlueParms {
- OSErr* errp;
- };
- typedef struct GlueParms GlueParms;
- struct ICCallGlue {
- PPC_Glue(GlueParms);
- };
- typedef struct ICCallGlue ICCallGlue;
- #pragma options align=reset
-
- ICCallGlue glue;
-
- if (inst == (ComponentInstance)0) {
- err = badComponentInstance;
- } else {
- SetupGlue(glue,kGetErrorSelector,GlueParms,inst);
-
- SetGlueParm(glue,errp,errp);
-
- err = CallComponentGlue(&glue);
- }
- return err;
- }
-
- pascal ComponentResult Comp_openlog(ComponentInstance inst,const char* ident,
- long logopt,short facility){
- ComponentResult err;
-
- #pragma options align=mac68k
- struct GlueParms {
- short facility;
- long logopt;
- const char* ident;
- };
- typedef struct GlueParms GlueParms;
- struct ICCallGlue {
- PPC_Glue(GlueParms);
- };
- typedef struct ICCallGlue ICCallGlue;
- #pragma options align=reset
-
- ICCallGlue glue;
-
- if (inst == (ComponentInstance)0) {
- err = badComponentInstance;
- } else {
- SetupGlue(glue,kopenlogSelector,GlueParms,inst);
-
- SetGlueParm(glue,ident,ident);
- SetGlueParm(glue,logopt,logopt);
- SetGlueParm(glue,facility,facility);
-
- err = CallComponentGlue(&glue);
- }
- return err;
- }
-
- pascal ComponentResult Comp_syslog(ComponentInstance inst,short priority,
- const char* message){
- ComponentResult err;
-
- #pragma options align=mac68k
- struct GlueParms {
- const char* message;
- short priority;
- };
- typedef struct GlueParms GlueParms;
- struct ICCallGlue {
- PPC_Glue(GlueParms);
- };
- typedef struct ICCallGlue ICCallGlue;
- #pragma options align=reset
-
- ICCallGlue glue;
-
- if (inst == (ComponentInstance)0) {
- err = badComponentInstance;
- } else {
- SetupGlue(glue,ksyslogSelector,GlueParms,inst);
-
- SetGlueParm(glue,message,message);
- SetGlueParm(glue,priority,priority);
-
- err = CallComponentGlue(&glue);
- }
- return err;
- }
-
- pascal ComponentResult Comp_closelog(ComponentInstance inst){
- ComponentResult err;
-
- #pragma options align=mac68k
- struct ICCallGlue {
- PPC_VoidGlue;
- };
- typedef struct ICCallGlue ICCallGlue;
- #pragma options align=reset
-
- ICCallGlue glue;
-
- if (inst == (ComponentInstance)0) {
- err = badComponentInstance;
- } else {
- SetupVoidGlue(glue,kcloselogSelector,inst);
-
- err = CallComponentGlue(&glue);
- }
- return err;
- }
-
- pascal ComponentResult Comp_setfile(ComponentInstance inst,FSSpecPtr spec){
- ComponentResult err;
-
- #pragma options align=mac68k
- struct GlueParms {
- FSSpecPtr spec;
- };
- typedef struct GlueParms GlueParms;
- struct ICCallGlue {
- PPC_Glue(GlueParms);
- };
- typedef struct ICCallGlue ICCallGlue;
- #pragma options align=reset
-
- ICCallGlue glue;
-
- if (inst == (ComponentInstance)0) {
- err = badComponentInstance;
- } else {
- SetupGlue(glue,kSetFileSelector,GlueParms,inst);
-
- SetGlueParm(glue,spec,spec);
-
- err = CallComponentGlue(&glue);
- }
- return err;
- }
-
- #endif
-
-